package com.zlj.huanxin;

import android.app.ActivityManager;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import com.hyphenate.EMCallBack;
import com.hyphenate.chat.EMChatManager;
import com.hyphenate.chat.EMChatRoomManager;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMContactManager;
import com.hyphenate.chat.EMGroupManager;
import com.hyphenate.chat.EMOptions;
import com.hyphenate.chat.EMPushManager;
import com.hyphenate.push.EMPushConfig;
import com.hyphenate.util.EMLog;
import com.zlj.huanxin.utils.PreferenceManager;

/****
 *
 * 描述 ：
 *
 * 创建 ：
 *
 * 日期 ：2021/4/7
 *
 *****/
public class HuanXinHelper {

    private static final String TAG = HuanXinHelper.class.getSimpleName();

    private static HuanXinHelper mInstance;

    public boolean isSDKInit;//SDK是否初始化

    private String currentUser;

    private HuanXinHelper() {
    }

    public static HuanXinHelper getInstance() {
        if (mInstance == null) {
            synchronized (HuanXinHelper.class) {
                if (mInstance == null) {
                    mInstance = new HuanXinHelper();
                }
            }
        }
        return mInstance;
    }

    /**
     * get push manager
     * @return
     */
    public EMPushManager getPushManager() {
        return getEMClient().pushManager();
    }

    /**
     * get EMChatManager
     * @return
     */
    public EMChatManager getChatManager() {
        return getEMClient().chatManager();
    }

    /**
     * 获取chatroom manager
     * @return
     */
    public EMChatRoomManager getChatroomManager() {
        return getEMClient().chatroomManager();
    }

    /**
     * 获取group manager
     * @return
     */
    public EMGroupManager getGroupManager() {
        return getEMClient().groupManager();
    }

    /**
     * 获取contact manager
     * @return
     */
    public EMContactManager getContactManager() {
        return getEMClient().contactManager();
    }

    /**
     * 判断是否之前登录过
     * @return
     */
    public boolean isLoggedIn() {
        return getEMClient().isLoggedInBefore();
    }

    /**
     * 获取IM SDK的入口类
     * @return
     */
    public EMClient getEMClient() {
        return EMClient.getInstance();
    }


    public void setAutoLogin(boolean autoLogin){
        PreferenceManager.getInstance().setAutoLogin(autoLogin);
    }

    public boolean getAutoLogin()
    {
        return PreferenceManager.getInstance().getAutoLogin();
    }


    public void init(Context context) {

        //初始化IM SDK
        if (initSDK(context)) {
            //在做打包混淆时，关闭debug模式，避免消耗不必要的资源
            EMClient.getInstance().setDebugMode(true);

            // 设置耳机监听，插入耳机后提示用户
            // 初始化推送
            // initPush(context);
        }

    }

    /**
     * 设置SDK是否初始化
     *
     * @param init
     */
    public void setSDKInit(boolean init) {
        isSDKInit = init;
    }

    public boolean isSDKInit() {
        return isSDKInit;
    }

    /**
     * 初始化SDK
     *
     * @param context
     * @return
     */
    private boolean initSDK(Context context) {
        // 根据项目需求对SDK进行配置
        EMOptions options = initChatOptions(context);
        //配置自定义的rest server和im server
        //options.setRestServer("a1-hsb.easemob.com");
        //options.setIMServer("116.85.43.118");
        //options.setImPort(6717);

        if (!isMainProcess(context)) {
            return false;
        }

        // 初始化SDK
        EMClient.getInstance().init(context, options);
        isSDKInit = true;

        return isSDKInit();
    }

    /**
     * 根据自己的需要进行配置
     *
     * @param context
     * @return
     */
    private EMOptions initChatOptions(Context context) {
        Log.d(TAG, "init HuanXin Options");

        EMOptions options = new EMOptions();
        // 设置是否自动接受加好友邀请,默认是true
        options.setAcceptInvitationAlways(false);
        // 设置是否需要接受方已读确认
        options.setRequireAck(true);
        // 设置是否需要接受方送达确认,默认false
        options.setRequireDeliveryAck(false);

        options.setUseRtcConfig(true);

        //设置推送消息

        //如果是私有部署，可以设置ip、端口等

        // 设置是否允许聊天室owner离开并删除会话记录，意味着owner再不会受到任何消息
        options.allowChatroomOwnerLeave(false);
        // 设置退出(主动和被动退出)群组时是否删除聊天消息
        options.setDeleteMessagesAsExitGroup(false);
        // 设置是否自动接受加群邀请
        options.setAutoAcceptGroupInvitation(false);
        // 是否自动将消息附件上传到环信服务器，默认为True是使用环信服务器上传下载
        options.setAutoTransferMessageAttachments(true);
        // 是否自动下载缩略图，默认是true为自动下载
        options.setAutoDownloadThumbnail(true);
        return options;
    }

    /**
     * 判断是否在主进程
     *
     * @param context
     * @return
     */
    public boolean isMainProcess(Context context) {
        int pid = android.os.Process.myPid();
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
            if (appProcess.pid == pid) {
                return context.getApplicationInfo().packageName.equals(appProcess.processName);
            }
        }
        return false;
    }

    public void logout(boolean unbindDeviceToken, final EMCallBack callBack) {
        EMClient.getInstance().logout(unbindDeviceToken,new EMCallBack(){
            @Override
            public void onSuccess() {
                if (callBack!=null){
                    callBack.onSuccess();
                }
            }

            @Override
            public void onProgress(int progress, String status) {
                if (callBack!=null){
                    callBack.onProgress(progress,status);
                }
            }

            @Override
            public void onError(int code, String error) {
                if (callBack!=null){
                    callBack.onError(code,error);
                }
            }
        });
    }

    /**
     * 初始化数据库
     * @param user
     */
    public void initDb(String user) {
//        if(currentUser != null) {
//            if(TextUtils.equals(currentUser, user)) {
//                EMLog.i(TAG, "you have opened the db");
//                return;
//            }
//            closeDb();
//        }
//        this.currentUser = user;
//        String userMd5 = MD5.encrypt2MD5(user);
//        // 以下数据库升级设置，为升级数据库将清掉之前的数据，如果要保留数据，慎重采用此种方式
//        // 可以采用addMigrations()的方式，进行数据库的升级
//        String dbName = String.format("em_%1$s.db", userMd5);
//        EMLog.i(TAG, "db name = "+dbName);
//        mDatabase = Room.databaseBuilder(mContext, AppDatabase.class, dbName)
//                .allowMainThreadQueries()
//                .fallbackToDestructiveMigration()
//                .build();
//        mIsDatabaseCreated.postValue(true);
    }



}
